#pragma once
#include <string>
#include <cstddef>
#include <odb/nullable.hxx>
#include <odb/core.hxx>

namespace bite_im {
    #pragma db object table("user")
    class User {
        public:
            User() {}
            // 用户名 -- 新增用户 -- 用户ID, 昵称, 密码
            User(const std::string &uid, const std::string &nickname, const std::string &password) : 
                _user_id(uid), _nickname(nickname), _password(password) {}
            // 用户名 -- 新增用户 -- 用户ID, 手机号, 随机昵称
            User(const std::string &uid, const std::string &phone) : 
                _user_id(uid), _nickname(uid), _phone(phone) {}

            void user_id(const std::string &val) {  _user_id = val; }
            std::string user_id() { return _user_id; }

            std::string nickname() { 
                if(!_nickname) return std::string();
                return *_nickname;
            }
            void nickname(const std::string &val) { _nickname = val; }

            std::string description() { 
                if(!_description) return std::string();
                return *_description;
            }
            void description(const std::string &val) { _description = val; }

            std::string password() { 
                if(!_password) return std::string();
                return *_password; 
            }
            void password(const std::string &val) { _password = val; }

            std::string phone() { 
                if(!_phone) return std::string();
                return *_phone; 
            }
            void phone(const std::string &val) { _phone = val; }

            std::string avatar_id() { 
                if(!_avatar_id) return std::string();
                return *_avatar_id; 
            }
            void avatar_id(const std::string &val) { _avatar_id = val; }

            
        private:
            friend class odb::access;
            #pragma db id auto
            unsigned long _id;
            #pragma db type("varchar(64)") index unique
            std::string _user_id;
            #pragma db type("varchar(64)") index unique
            odb::nullable<std::string> _nickname; // 用户昵称 - 不一定存在
            odb::nullable<std::string> _description; // 用户签名 - 不一定存在
            #pragma db type("varchar(64)") 
            odb::nullable<std::string> _password; // 用户密码 - 不一定存在
            #pragma db type("varchar(64)") index unique
            odb::nullable<std::string> _phone; // 用户手机号 - 不一定存在
            #pragma db type("varchar(64)")
            odb::nullable<std::string> _avatar_id; // 用户头像文件ID - 不一定存在
    };
}
// odb -d mysql --std c++11 --generate-query --generate-schema --profile boost/date-time